<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<title>哈希表的封装</title>
</head>

<body>
</body>

</html>
<script type="text/javascript">

	/*
		链地址法：
		loadFactor  >0.75 数据会慢，扩容
		loadFactor  <0.25  减容
	*/

	// 封装哈希表类
	function HashTable() {
		// 属性
		this.storage = []
		this.count = 0
		this.limit = 7
		// 方法
		// 哈希函数
		HashTable.prototype.hashFunc=function(str, size){
			// 1.定义hashCode变量
			var hashCode = 0
			// 2.霍纳算法，来计算hashCode的值
			// cats  -> Unicode编码
			for (var i = 0; i < str.length; i++) {
				hashCode = 37 * hashCode + str.charCodeAt(i)
			}
			// 3.取余操作
			var index = hashCode % size
			return index
		}

		// 插入和修改操作
		HashTable.prototype.put = function (key, value) {
			// 1.根据key获取索引值，将数据插入到对应的文字	
			var index = this.hashFunc(key, this.limit)

			// 2. 根据index取出对应的bucket
			var bucket = this.storage[index]

			// 3.判断该bucket是否为空
			if (bucket == null) {
				bucket = []
				this.storage[index] = bucket
			}

			// 4.判断是否是修改数据
			for (var i = 0; i < bucket.length; i++) {
				var tuple = bucket[i]
				if (bucket[0] == key) {
					tuple[1] = value
					return
				}
			}
			// 5.进行添加操作
			bucket.push([key.value])
			this.count += 1

		}
	}
</script>